package zgh.singleton;

import java.io.Serializable;

/**
 * @author zhanggonghui
 * @create 2022-04-16 22:49
 * @describe 用于测试序列化破坏单例
 **/
public class Singleton implements Serializable {
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

    /**
     * 增加readResolve就可以解决序列化破坏单例的问题
     * 因为反序列化过程中，在反序列化执行过程中会执行到ObjectInputStream#readOrdinaryObject方法，这个方法会判断对象是否包含readResolve方法，如果包含的话会直接调用这个方法获得对象实例。
     * 不增加该代码，会继续采用反射返回对象，可是为什么不像反射一样返回异常呢？
     * 因为，反序列化使用的反射构造器和我们代码中使用反射的构造器不是同一个，反序列化用到的构造器并不会调用到我们对象中的构造函数
     */
//    private Object readResolve() {
//        return getSingleton();
//    }

}
